函式是頭等物件,如同其他物件一樣可以
-  藉由 實質 建立
-  指派給 變數 或 屬性
-  被當作 參數 傳遞
-  作為函式執行結果回傳回來
-  設定屬性 和方法
屬性,並且在那些屬性 可以用來 儲存 任何資訊:
暫存,避免不必要的計算宣告函式、函式表達式、箭頭函式、函式生成器
獨立 的敘述句參數 是我們定義函式時所列出來的變數,而 引數 是我呼叫它時,傳遞給函式的值undefined
參數
不定參數 和 預設參數 是JS的新功能:
多餘引數
模組化執行單元
多樣功能 和 強固結構 函式,會在開發時有很大的 靈活性和控制權
實質 來建立。{}
變數、陣列資料 ,或其他物件的屬性引數 傳遞給函式函式的回傳值
動態 建立和 指派的屬性////可以被指派給 `變數`、`陣列資料` ,或其他物件的屬性。
var ninja = {};
ninjaArray.push({});
ninja.data= {};
////可作為 `引數` 傳遞給函式。
function hide(ninija){
ninja.visiblity = false; 
//將傳遞進來的物件的 `visiblity` 屬性設置為 `false`
}
hide({}); // 傳遞一個空物件給 `hide` 函式
////可以作為 `函式的回傳值`
function returnNewNinja(){
return{}; // 返回一個空物件
}
////擁有可 `動態` 建立和 指派的屬性
var ninja = {};
ninja.name = "Hanzo";
// 動態為物件添加一個 `name` 屬性,並將其設置為 "Hanzo"
//// 藉由 `實質` 來建立
function ninjaFunction(){}
////可以被指派給 `變數`、`陣列資料` ,或其他物件的屬性。
var ninjaFunction = function(){};
ninjaArray.push(function(){}); // 在陣列中推送一個空函式
ninja.data = function(){}; // 在物件中創建一個名為 `data` 的屬性,並指派一個空函式
////可作為 `引數` 傳遞給函式。
function call(ninjaFunction){
ninjaFunction(); // 呼叫傳遞進來的函式
}
call(function(){}); // 傳遞一個空函式給 `call` 函式
////可以作為 `函式的回傳值`
function returnNewNinjaFunction(){
return function(){}; // 返回一個空函式
}
////擁有可 `動態` 建立和 指派的屬性
var ninjaFunction = function(){};
ninjaFunction.ninja = "Hanzo";
//在函式上動態添加一個 `ninja` 屬性,並將其設置為 "Hanzo"
////指派給變數
const add = function(a, b) {
    return a + b;
};
const operation = add;
console.log(operation(2, 3));  // 輸出:5
////作為函式引數傳遞
function doOperation(a, b, operation) {
    return operation(a, b);
}
console.log(doOperation(4, 2, add));       // 輸出:6
console.log(doOperation(4, 2, multiply));  // 輸出:8
////作為函式的回傳值
function createMultiplier(factor) {
    return function(x) {
        return x * factor;
    };
}
const double = createMultiplier(2);
console.log(double(5));  // 輸出:10
忍者2